package com.zishuimuyu.trans.impl;

;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zishuimuyu.http.HttpParams;
import com.zishuimuyu.http.HttpPostParams;
import com.zishuimuyu.trans.AbstractOnlineTranslator;
import com.zishuimuyu.trans.LANG;
import com.zishuimuyu.trans.annotation.TranslatorComponent;

/**
 * 使用 @TranslatorComponent 注解标记该类为翻译组件，其唯一标识符为 "tencent"
 */
@TranslatorComponent(id = "tencent")
/**
 * 最终的腾讯翻译器类，继承自 AbstractOnlineTranslator 类。
 * 该类实现了使用腾讯翻译 API 进行翻译的功能。
 */
final public class TencentTranslator extends AbstractOnlineTranslator {

    /**
     * 构造函数，用于初始化语言映射。
     * 此方法将内部语言枚举 LANG 映射到腾讯翻译 API 所支持的语言代码。
     */
    public TencentTranslator() {
        // 将英文 LANG.EN 映射到腾讯翻译 API 支持的 "1" 代码
        langMap.put(LANG.EN, "1");
        // 将中文 LANG.ZH 映射到腾讯翻译 API 支持的 "0" 代码
        langMap.put(LANG.ZH, "0");
    }

    /**
     * 重写父类的 getResponse 方法，用于向腾讯翻译 API 发送请求并获取响应。
     *
     * @param from  源语言，使用 LANG 枚举表示
     * @param targ  目标语言，使用 LANG 枚举表示
     * @param query 需要翻译的文本
     * @return 腾讯翻译 API 返回的响应字符串
     * @throws Exception 如果在发送请求过程中发生异常
     */
    @Override
    protected String getResponse(LANG from, LANG targ, String query) throws Exception {
        // 创建一个 HttpPostParams 对象，用于构建 POST 请求的参数
        HttpParams params = new HttpPostParams()
                // 添加源语言参数，根据语言映射获取对应的腾讯翻译 API 代码
                .put("sl", langMap.get(from))
                // 添加目标语言参数，根据语言映射获取对应的腾讯翻译 API 代码
                .put("tl", langMap.get(targ))
                // 添加需要翻译的文本参数
                .put("st", query);

        // 发送请求并将响应内容作为字符串返回
        return params.send2String("http://fanyi.qq.com/api/translate");
    }

    /**
     * 重写父类的 parseString 方法，用于解析腾讯翻译 API 返回的 JSON 响应字符串。
     *
     * @param jsonString 腾讯翻译 API 返回的 JSON 响应字符串
     * @return 解析后的翻译结果字符串
     */
    @Override
    protected String parseString(String jsonString) {
        // 创建一个 StringBuilder 对象，用于拼接翻译结果
        StringBuilder str = new StringBuilder();
        // 将 JSON 字符串解析为 JSONObject 对象
        JSONObject rootObj = JSONObject.parseObject(jsonString);
        // 从 JSON 对象中获取翻译结果数组
        JSONArray array = rootObj.getJSONArray("result");

        // 遍历翻译结果数组
        for (int i = 0; i < array.size(); i++) {
            // 将当前结果的翻译文本添加到 StringBuilder 中
            str.append(array.getJSONObject(i).getString("dst"));
        }
        // 将 StringBuilder 转换为字符串并返回
        return str.toString();
    }

}

